Android ViewModel
ViewModelはViewのことを知らない。ViewはViewModelを監視してる。
SubjectはObserverのことを知らない。一心不乱に別の場所に通知を出す。
#MVVM を最初に抑える。Model View ViewModel の Androidでの方法 The class class is designed to store and manage UI-related data in a lifecycle conscious way.
利点
so that data they hold is immediately available to the next activity or fragment instance.
ViewModel オブジェクトは、対象のActivityより(ちょっとだけ)長生きだし、activityのdestroyでご破産としない。
Activityがfinishすると、onCleared()を呼んで対象リソース(liveData)を消す、自分自身も消す?
Activityの再生性をいかに生き残るか?は、詳細わからずだけど、
ViewModel の実装を読み進めていくと、この Fragment#setRetainInstance メソッドを使った Fragment が出てきます
が参考になる。
ViewModelのconstructorに引数を渡したい場面は、目的がDIでなくてもあるかな。
これは、ViewModelの中から Actibity側を参照する形になるので、良くない(はず)
Injectするものは(も)、disposalにしないといけない?
以下、メモの残骸。
--------------------------------------------------------------
ViewModelのlifecycleの絵がよく出てきて、ViewModelの objectは app全体で生き残るけど、
通常は、lifecycleOwner(あるActivity)の範囲でしか、管理しない。
you actually create/retain a ViewModelStore which is bound to this,
なので、activity間で残るようにするには、singletonにする
が、筋悪。
ここに、AndroidViewmodelというclassの例があった。
ここでは、
ここでは、repositoryのconsuctorのparameterに使ってる。
感想: ViewModelはActivity単位(スコープ)が自然なので、packageをActivity単位にするのが妥当なフォルダ分けかな。
関連topic:
責務?
app全体で、データの保持、更新?に責任を持つ
実際の Implement, ViewModelの定義(クラス)と、それをactivityやfragmentで実体化して使う事の両面
ViewModelの継承(定義)
code: viewmodelExample.kt
class MyViewModel : ViewModel() {
private val users: MutableLiveData<List<User>> by lazy {
MutableLiveData().also {loadUsers() }
}
fun getUsers(): LiveData<List<User>> { return users }
private fun loadUsers() {
// Do an asynchronous operation to fetch users.
}
}
ViewModelを継承する MyViewModelは、
getUsersメソッドを外部に公開する。
loadUsers()はprivateで、initializationでuser取得を実装しておく。
View(AcitibvityやFragment)側は、
ViewModelProviders.of(...から viewModelを取得して、
その liveData部分(getUsers())をobserve(this, Observer..)する
code: CallViewModel.kt
model.getUsers().observe(this, Observer<List<User>>{ users ->
// update UI .
})
When the owner activity is finished, ......onCleared() method so that it can clean up resources.
で、後始末もしてくれると。
model側(データのCRUDをする)は、
viewModel側が公開してるメソッドなどを使って, viewModelのvalueを更新していく
modelへの操作の起点はユーザーの操作だとしたら、
modelの記述はactivityやfragmentに書いてしまうこともあるけど、基本はmodel用用のファイルやクラスを作る?
ViewModelのlifecycle:
ViewModelのlifecycle, Applicationが存続する期間と同じ
もしも Activity の参照を ViewModel が持ってしまったら、寿命が切れた Activity の参照を持ち続けてしまいます...
https://gyazo.com/5f59f99f02676a424c23521337d325a3
Tutorial:
こちらが、非常に良いと思う
参考:
but problem arises when ViewModel needs to communicate View state, progress indicator status, validation/server errors.